/*
 * Licensed to the Tai Ping Jin Ke
 *
 * Copyright (c) 2022 .
 * All rights reserved.
 * 项目名称：太平金科-基础组件封装层-对象存储服务OSS-缺省实现
 * 版权说明：本软件属太平金融科技服务(上海)有限公司所有，在未获得太平金融科技服务(上海)有限公司正式授权情况下，任何企业和个人，不能获取、阅读、安装、传播本软件涉及的任何受知识产权保护的内容。
 */
package com.taipingframework.boot.minio.autoconfigure;

import com.taipingframework.boot.minio.ObjectStorageService;
import com.taipingframework.boot.minio.ObjectStorageServiceImpl;
import com.taipingframework.boot.minio.properties.MinioProperty;
import io.minio.MinioClient;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration(proxyBeanMethods = false)
@ConditionalOnProperty(
        prefix = "application.minio",
        name = {"endpoint", "access-key", "secret-key"}
)
public class MinioAutoConfiguration {

    /**
     * 分布式对象存储服务MinIO连接配置
     */
    @Bean
    @ConfigurationProperties(prefix = "application.minio")
    public MinioProperty minioProperty() {
        return new MinioProperty();
    }

    /**
     * 分布式对象存储服务MinIO 客户端对象
     */
    @Bean
    public MinioClient minioClient(MinioProperty minioProp) {
        return MinioClient.builder()
                .endpoint(minioProp.getEndpoint())
                .credentials(minioProp.getAccessKey(), minioProp.getSecretKey())
                .build();
    }

    /**
     * 分布式对象存储服务MinIO 客户端对象包装类
     */
    @Bean
    public ObjectStorageService objectStorageService(MinioClient minioClient) {
        //FIXME
        // 此处做个标记：MinIO分片上传 与 MinIO分段下载功能尚未实现
        // (1)minIO分片上传 参考案例 https://blog.csdn.net/weixin_39817571/article/details/135932659
        // (2)minIO分段下载 参考案例 https://www.bilibili.com/read/cv21016230/?from=search&spm_id_from=333.337.0.0
        // 这部分有点复杂，目前代码这部分代码并没有经过实际测试，需要在实际运用中对相关编码逻辑进行合理的修改与重新组织，这里仅仅提供思路
        // 上述两个功能点实现且所有API实际测试通过之后，请立即删除此处的备注！！！
        return new ObjectStorageServiceImpl(minioClient);
    }

}
